<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="vHFWu" id="vHFWu"><span data-lake-id="ud12897a8" id="ud12897a8">典型回答</span></h1>
  <p data-lake-id="u18dfe330" id="u18dfe330"><br></p>
  <p data-lake-id="ub9db705e" id="ub9db705e"><span data-lake-id="u96ec6ac1" id="u96ec6ac1">会。</span></p>
  <p data-lake-id="uc63b6187" id="uc63b6187"><span data-lake-id="u8dc8b7f2" id="u8dc8b7f2">​</span><br></p>
  <p data-lake-id="u0d8ba1f7" id="u0d8ba1f7"><span data-lake-id="u757f6f8a" id="u757f6f8a">因为数据库的锁锁的是索引，并不是记录。</span></p>
  <p data-lake-id="u8d4bf8c0" id="u8d4bf8c0"><span data-lake-id="u7add7293" id="u7add7293">​</span><br></p>
  <p data-lake-id="u4770ffc1" id="u4770ffc1"><span data-lake-id="u5c84cfbb" id="u5c84cfbb">当我们在事务中，更新一条记录的时候，如果用到普通索引作为条件，那么会先获取普通索引的锁，然后再尝试获取主键索引的锁。</span></p>
  <p data-lake-id="u2391b89a" id="u2391b89a"><span data-lake-id="u47bba2c5" id="u47bba2c5">​</span><br></p>
  <p data-lake-id="ue73097ab" id="ue73097ab"><span data-lake-id="u60dad741" id="u60dad741">那么这个时候，如果刚好有一个线程，已经拿到了这条记录的主键索引的锁后，同时尝试在该事务中去拿该记录的普通索引的锁。</span></p>
  <p data-lake-id="udc418c3c" id="udc418c3c"><span data-lake-id="u1d2c5b74" id="u1d2c5b74">​</span><br></p>
  <p data-lake-id="ub73eb3ff" id="ub73eb3ff"><span data-lake-id="u77ea04fd" id="u77ea04fd">这时候就会发生死锁。</span></p>
  <p data-lake-id="u5b67a939" id="u5b67a939"><span data-lake-id="u440a3cfd" id="u440a3cfd">​</span><br></p>
  <pre lang="java"><code>
update my_table set name = 'hollis',age = 22 where name = "hollischuang";

这个SQL会先对name加锁， 然后再回表对id加锁。

-----

select * from my_table where id = 15 for update;

update my_table set age = 33 where name like "hollis%";

以上SQL，会先获取主键的锁，然后再获取name的锁。
</code></pre>
  <p data-lake-id="u9df34764" id="u9df34764"><span data-lake-id="u2f96ec7b" id="u2f96ec7b">​</span><br></p>
  <p data-lake-id="u2aa7748b" id="u2aa7748b"><span data-lake-id="u87b7a604" id="u87b7a604">为了避免这种死锁情况的发生，可以在应用程序中设置一个规定的索引获取顺序，例如，只能按照主键索引-&gt;普通索引的顺序获取锁，这样就可以避免不同的线程出现获取不同顺序锁的情况，进而避免死锁的发生（靠SQL保证）。</span></p>
  <p data-lake-id="ud9c07ace" id="ud9c07ace"><br></p>
 </body>
</html>